.TITLE DRSCA .IDENT /02.10/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; T. J. MILLER 23-OCT-77 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; B. S. MCCARTHY ; ; ; MODIFIED BY: ; ; J. M. LAWLER 29-JUN-83 02.09 ; ; JL162 -- CONDITIONALIZE DRSMP,DRMVS ON S$$MAP ; ; B. S. MCCARTHY 20-MAR-83 02.10 ; ; BM295 -- REMOVE REFERENCES TO $HEADR TO STREAMLINE ; PROCESSING ; ; SUPERVISOR MODE. ; ; LOCAL MACRO DEFINITIONS ; .IF DF S$$LIB .MCALL ABODF$,HWDDF$ ABODF$ ;DEFINE TASK ABORT CODES HWDDF$ ;DEFINE HARDWARE DEFINITIONS ;+ ; **-$DRSCA-SUPERVISOR CALL ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CALL TO CALL A SUPERVISOR MODE ; SUBROUTINE AT THE SPECIFIED SUPERVISOR I SPACE VIRTUAL ADDRESS WITH ; THE SPECIFIED COMPLETION ROUTINE ADDRESS. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(155.),DPB SIZE(3.). ; WD. 01 -- ADDRESS OF SUPERVISOR ROUTINE TO CALL. ; WD. 02 -- ADDRESS OF SUPERVISOR COMPLETION ROUTINE. ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF SUPERVISOR ROUTINE TO CALL IN DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: ; ; THE SPECIFIED ROUTINE IS CALLED IN SUPERVISOR MODE WITH THE ; COMPLETION ROUTINE SET UP. CONDITION CODE AND DSW ; RETURNS ARE RESERVED FOR THE SUPERVISOR ROUTINE ITSELF. ; ; (IF THERE IS INSUFFICIENT SPACE ON THE TASK STACK FOR THE ; SUPERVISOR RETURN SETUP, THE ISSUING TASK IS ABORTED.) ;- $DRSCA::MFPI SP ;RETRIEVE CURRENT STACK POINTER ADD $BTRMV,(SP) ;REMOVE BYTES FROM DIRECTIVE CALL MOV (SP),R2 ;SAVE COPY OF STACK POINTER MTPI SP ;RESTORE MODIFIED STACK POINTER CLR $BTRMV ;PREVENT DIRECTIVE DISPATCHER MOD TSTB $SUPFL ;ISSUING TASK LINKED TO SUPER MODE ? BEQ 30$ ;IF EQ NO, DON'T ALLOW DIRECTIVE CALL $SGFIN ;SET TO SET CARRY ON TRAPS MOV 2(R3),-(SP) ;PUSH SUPERVISOR COMPLETION ADDRESS MOV #$UMPC,R1 ;POINT TO TRAP PC MOV (R1)+,-(SP) ;SAVE TRAP PC MOV (R1),-(SP) ;SAVE TRAP PS MOV #CSMODE!PMODE,(R1) ;SET FOR SUPERVISOR RETURN PS (PREV=USR) BIC #17,(SP) ;CLEAR ALL CONDITION CODES IN PS WORD BMI 10$ ;IF MI PREVIOUS MODE WAS USER BIC #^CPSMODE&PMODE,(R1) ;ELSE SET PREVIOUS MODE TO SUPERVISOR 10$: CLC ;INIT C-BIT TO 0 MOV (R3)+,-(R1) ;SET SUPERVISOR RETURN PC FROM THE DPB MFPI #0 ;ATTEMPT TO FETCH LOCATION ZERO IN ;SUPERVISOR LIBRARY BCS 13$ ;IF CS NO LOCATION ZERO, CERTAINLY ;ISN'T NEW INTERFACE CMP (SP)+,(PC)+ ;IS LOCATION ZERO A CMP (SP)+,(SP)+ CMP (SP)+,(SP)+ ;(IF IT IS THIS IS A VERSION 2 LIBRARY ;SINCE IT HAS THE ODT TRANSFER VECTOR BEQ 15$ ;IF EQ HANDLE LINKAGE TO V2 LIBRARY 13$: CLC ;CLEAR CARRY AND START V1 LINKAGE MTPD -(R2) ;PUSH TRAP PS ON SUPER STACK (MAY TRAP) MTPD -(R2) ;PUSH TRAP PC ON SUPER STACK (MAY TRAP) MTPD -(R2) ;PUSH COMPLETION ADDRESS ON SUPER STACK BCS 20$ ;IF CS TRAP ON SUPERVISOR STACK REF BR 17$ ;FINISH IN COMMON CODE 15$: CLC ;CLEAR CARRY INITIALLY MOV 4(SP),-(SP) ;COPY PREVIOUS MODE RETURN ADDRESS MTPD -(R2) ;PUT IT ON SUPERVISOR STACK MOV (SP),-(SP) ;WE NEED A PLACEHOLDER, MUST BE MOVE ;TO NOT AFFECT C BIT MTPD -(R2) ;ONTO SUPERVISOR STACK MTPD -(R2) ;COPY PS TO SUPERVISOR STACK MOV (SP),(SP)+ ;DISCARD RETURN PC, LEAVE C ALONE MTPD -(R2) ;PUSH COMPLETION ROUTINE ADDRESS BCS 20$ ;IF CS TRAP ON SUPER STACK REFERENCE 17$: MOV R2,-(SP) ;PUSH NEW SUPERVISOR STACK POINTER MTPI SP ;UPDATE SUPERVISOR STACK POINTER RETURN ; 20$: MOV #S.CAST,R0 ;SET FOR BAD STACK ABORT CALLR $ABCTK ;ABORT ISSUING TASK 30$: DRSTS D.RS8 ;ERROR - INCONSISTENT WITH TASK STATE .ENDC ;+ ; **-$DRSMP-MODIFY SUPERVISOR MAPPING ; ; THIS DIRECTIVE ALLOWS A USER TASK TO MODIFY THE MAPPING OF ; SUPERVISOR DATA SPACE. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(201.),DPB SIZE(2.) ; WD. 01 -- NEW SUPERVISOR MAPPING PARAMETER MASK. THE MASK ; IS CODED IN BITS 8.-14. OF THE WORD, WITH BIT 8. ; CORRESPONDING TO APR1, ETC. IF A BIT IS SET TO 0, ; THEN THE CORRESPONDING APR IS MAPPED TO USER D ; SPACE. IF ONE, THEN THE APR IS MAPPED TO SUPER ; I SPACE. APR 0 IS ALWAYS MAPPED TO USER D SPACE. ; IF BIT 15 IS SET, THE MAPPING MASK IS NOT ; CHANGED, BUT THE STATUS IS RETURNED. ; ; INPUTS: ; ; R4=ADDRESS OF HEADER OF THE CURRENT TASK ; ; OUTPUTS: ; ; THE SUPERVISOR MAPPING MASK (H.SMAP) IS SET AND THE APRS ARE ; UPDATED. THE DSW IS RETURNED WITH BITS 0-7 BEING THE HIGH ; BYTE OF THE PSW (AT TIME OF DIRECTIVE ISSUANCE), AND BITS ; 8.-14. BEING THE OLD MAPPING MASK. BIT 15. IS ALWAYS ZERO. ; IN SYSTEMS WHICH DO NOT SUPPORT SUPERVISOR MODE LIBRARIES, ; THE HIGH BYTE IS ALWAYS RETURNED AS ZERO. ;- .IF DF, S$$MAP $DRSMP::MOVB $STACK-1,2(SP) ;SET LOW BYTE OF DIRECTIVE STATUS .IF DF S$$LIB MOVB H.SMAP(R4),3(SP) ;SET HIGH BYTE OF DIRECTIVE STATUS MOV (R3),R0 ;GET NEW MAPPING PARAMETER BMI 10$ ;IF MI INFORMATION ONLY DIRECTIVE SWAB R0 ;PUT SUPER MAP WHERE WE CAN GET AT IT MOVB R0,H.SMAP(R4) ;RESET SUPERVISOR MAPPING MASK TSTB $SUPFL ;TASK USING SUPERVISOR WINDOWS ? BEQ 10$ ;IF EQ NO CALLR $LSUP1 ;RESET SUPER MODE APRS 10$: ;REFERENCE LABEL .ENDC ; DF S$$LIB RETURN ;RETURN TO DIRECTIVE DISPATCHER ;+ ; **-$DRMVS-MOVE TO/FROM VARIOUS TASK SPACES ; ; THIS DIRECTIVE ALLOWS A USER TASK TO READ/WRITE DATA (ONE WORD ; AT A TIME), INTO ITS SUPER/USER I/D SPACES. THE DIRECTIVE IS ; INTENDED FOR USE BY COMPONENTS SUCH AS DEBUGGERS, WHERE EASE OF USE ; OF THE DIRECTIVE OVERRIDES PERFORMANCE CONSIDERATIONS. ; ; DPB FORMAT: ; ; WD 00. -- DIC(203.),DPB SIZE(4.) ; WD 01. -- CONTROL FLAGS WORD. FLAGS ARE: ; BIT 0 - IF ZERO, TARGET SPACE IS USER ; IF ONE, TARGET SPACE IS SUPER ; BIT 1 - IF ZERO, TARGET SPACE IS INST ; IF ONE, TARGET SPACE IS DATA ; BIT 2 - IF ZERO, DIRECTION IS MOVE FROM ; IF ONE, DIRECTION IS MOVE TO ; WD 02. -- ADDRESS OF SOURCE/DESTINATION WORD ; WD 03. -- ADDRESS OF BUFFER IF MOVE FROM ; VALUE IF MOVE TO ; ; INPUTS: ; ; R3=ADDRESS OF CONTROL FLAGS WORD IN DPB ; ; OUTPUTS: ; ; THE DESTINATION OR BUFFER IS UPDATED ; ; A STATUS OF D.RS16 IS RETURNED IF A MOVE TO IS EXECUTED ; FOR A DESTINATION TO WHICH THE ISSUEING TASK DOES NOT HAVE ; WRITE ACCESS. ; ; A STATUS OF D.RS98 IS RETURNED IF THE ADDRESS OR BUFFER IS ; NOT IN THE TASK'S CURRENT ADDRESS SPACE. ;- $DRMVS::MOV (R3)+,R5 ;PICK UP FLAGS WORD MOV #UINDR0,R0 ;ASSUME USER I-SPACE ASR R5 ;IS IT USER SPACE ? .IF DF S$$LIB BCC 10$ ;IF CC YES TSTB $SUPFL ;CURRENT TASK USE SUPERVISOR MODE ? BEQ 30$ ;IF EQ NO, ILLEGAL ADDRESS MOV #SISDR0,R0 ;ADJUST TO SUPERVISOR SPACE 10$: ;REFERENCE LABEL .ENDC ; DF S$$LIB ASR R5 ;IS IT I OR D SPACE ? .IF DF U$$DAS!S$$LIB BCC 20$ ;IF CC I SPACE ADD #UDSDR0-UINDR0,R0 ;ADJUST TO D SPACE 20$: ;REFERENCE LABEL .ENDC ; DF U$$DAS!S$$LIB MOV (R3)+,R4 ;GET ADDRESS OF OPERAND BIT #1,R4 ;ODD ADDRESS ? BNE 30$ ;IF NE YES MOV R4,R1 ;MAKE A COPY BIC #17777,R1 ;CLEAR ALL BUT APR BITS SWAB R1 ;MOVE TO LOW HALF ASH #-4,R1 ;AND CREATE WORD INDEX ADD R1,R0 ;POINT TO CORRECT PDR MOV (R0),R2 ;GET PDR CONTENTS FOR TEST BNE 40$ ;IF NE THERE IS SOME ACCESS 30$: DRSTS D.RS98 ;EXIT WITH ERROR STATUS 40$: MOV R4,R1 ;COPY VIRTUAL ADDRESS AGAIN BIC #160000,R1 ;CLEAR OUT APR BITS BIC #77,R1 ;32 WORD BOUNDARY ASL R1 ;SHIFT TO SAME PLACE ASL R1 ;AS IN PDR BIC #100377,R2 ;CLEAR ALL BUT PLF FROM PDR CMP R1,R2 ;DESIRED ADDRESS WITHIN MAPPING ? BHI 30$ ;IF HI NO, ILLEGAL ADDRESS MOV (R3),R3 ;SAVE ADDRESS (OR VALUE) MOV UINAR0-UINDR0(R0),KISAR6 ;MAP TO DESIRED ADDRESS BIC #160000,R4 ;CLEAR ALL BUT DISPLACEMENT BIS #140000,R4 ;COMMUTE ADDRESS TO APR6 ASR R5 ;MOVE FROM OR TO ? BCS 50$ ;IF CS IT'S MOVE TO MOV (R4),-(SP) ;GET VALUE MOV #2,R1 ;SET SIZE OF BUFFER CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK MOV (SP)+,(R3) ;RETURN PARAMETER RETURN ;AND EXIT 50$: BIT #4,(R0) ;WRITE ACCESS TO REGION ? BNE 55$ ;IF NE YES,ALLOW MOV $TKTCB,R5 ;GET TCB ADDRESS OF ISSUING TASK BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED BEQ 60$ ;IF EQ NO, DISALLOW 55$: MOV R3,(R4) ;FILL IN DESTINATION RETURN ;AND EXIT SUCCESSFULLY 60$: DRSTS D.RS16 ;PRIVILEGE VIOLATION .ENDC ; DF S$$MAP .END